package tests;

import java.util.Collection;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;

import security.LoginService;
import services.ComunidadDeVecinosService;
import services.MensajeComunidadService;
import services.MensajeService;
import services.VecinoService;
import utilities.PopulateDatabase;
import domain.ComunidadDeVecinos;
import domain.Mensaje;
import domain.MensajeComunidad;
import domain.Vecino;

@ContextConfiguration(locations = { "classpath:spring/datasource.xml",
"classpath:spring/config/packages.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class CU57ListarMensajesRecibidosVecino {
	
	@Autowired
	private MensajeComunidadService mensajeComunidadService;
	
	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;
	
	@Autowired
	private MensajeService mensajeService;
	
	@Autowired
	private VecinoService vecinoService;
	
	
	@Autowired
	private LoginService loginService;

	public void authenticate(String username) {
		UserDetails userDetails;
		TestingAuthenticationToken authenticationToken;
		SecurityContext context;
		userDetails = loginService.loadUserByUsername(username);
		authenticationToken = new TestingAuthenticationToken(userDetails, null);
		context = SecurityContextHolder.getContext();
		context.setAuthentication(authenticationToken);
	}

	@Before
	public void setUp() {
		PopulateDatabase.main(null);
	}
	@Test
	public void testListarTodosMensajesRecibidosByVecino(){
		
		//Me creo un mensaje a un vecino
		Mensaje result;
		Vecino vecino;
		authenticate("admin1");
		result = mensajeService.create();
		vecino = vecinoService.findOne(12);
		result.setAsunto("Hola");
		result.setContenido("Hola");
		result.setVecino(vecino);
		//Me creo un mensaje a una CV
		MensajeComunidad result2;
		ComunidadDeVecinos comunidad;
		result2 = mensajeComunidadService.create();
		comunidad = comunidadDeVecinosService.findOne(10);
		result2.setAsunto("Hola");
		result2.setContenido("Hola");
		result2.setComunidadDeVecinos(comunidad);
		mensajeComunidadService.save(result2);
		mensajeService.save(result);
		
		authenticate("12345678K");
		Collection<Mensaje> mensajes;
		
		mensajes = mensajeService.findByVecino();

		Assert.isTrue(mensajes.size()==1);
		
		Collection<MensajeComunidad> mensajesComunidad;
		
		mensajesComunidad = mensajeComunidadService.findByComunidades();

		Assert.isTrue(mensajesComunidad.size()==1);
		
	}

	@Test(expected = IllegalArgumentException.class)
	public void testListarTodosMensajesRecibidosByAdministrador(){
		authenticate("admin1");
		//Me creo un mensaje a un vecino
		Mensaje result;
		Vecino vecino;
		
		result = mensajeService.create();
		vecino = vecinoService.findOne(12);
		result.setAsunto("Hola");
		result.setContenido("Hola");
		result.setVecino(vecino);
		//Me creo un mensaje a una CV
		MensajeComunidad result2;
		ComunidadDeVecinos comunidad;
		result2 = mensajeComunidadService.create();
		comunidad = comunidadDeVecinosService.findOne(10);
		result2.setAsunto("Hola");
		result2.setContenido("Hola");
		result2.setComunidadDeVecinos(comunidad);
		mensajeComunidadService.save(result2);
		mensajeService.save(result);
		
		Collection<Mensaje> mensajes;
		
		mensajes = mensajeService.findByVecino();

		Assert.isTrue(mensajes.size()==1);
		
		Collection<MensajeComunidad> mensajesComunidad;
		
		mensajesComunidad = mensajeComunidadService.findByComunidades();

		Assert.isTrue(mensajesComunidad.size()==1);
		
	}
	

}
